home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_std / collection3.e < prev    next >
Text File  |  2000-03-25  |  14KB  |  530 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. deferred class COLLECTION3[E]
  13.    -- 
  14.    -- Abstract definition of a 3 dimensional collection of elements
  15.    -- of type E. 
  16.    -- 
  17.    -- The SmallEiffel standard library (lib_std) provides two
  18.    -- implementations : ARRAY3[E] and FIXED_ARRAY3[E].
  19.    -- All implementations have exactly the same behavior. Switching 
  20.    -- from one implementation to another only change the memory used
  21.    -- and the execution time.
  22.    --
  23.    -- Initially written by Jean-Philippe Caillaut in Mai 1999
  24.    --
  25.  
  26. inherit
  27.    ANY
  28.       undefine copy, is_equal
  29.       redefine fill_tagged_out_memory
  30.       end;
  31.    
  32. feature -- Indexing :
  33.    
  34.    lower1: INTEGER is
  35.      -- Lower index bound for dimension 1.
  36.       deferred
  37.       end;
  38.    
  39.    lower2: INTEGER is
  40.      -- Lower index bound for dimension 2.
  41.       deferred
  42.       end;
  43.    
  44.    lower3: INTEGER is
  45.      -- Lower index bound for dimension 3.
  46.       deferred
  47.       end;
  48.    
  49.    frozen line_minimum: INTEGER is
  50.      -- Equivalent of `lower1'.
  51.       do
  52.      Result := lower1;
  53.       end;
  54.    
  55.    frozen column_minimum: INTEGER is
  56.      -- Equivalent of `lower2'.
  57.       do
  58.      Result := lower2;
  59.       end;
  60.  
  61.    frozen depth_minimum: INTEGER is
  62.          -- Equivalent of `lower3'.
  63.       do
  64.          Result := lower3;
  65.       end;
  66.    
  67.    upper1: INTEGER is
  68.      -- Upper index bound for dimension 1.
  69.       deferred
  70.       end;
  71.    
  72.    upper2: INTEGER is
  73.      -- Upper index bound for dimension 2.
  74.       deferred
  75.       end;
  76.    
  77.    upper3: INTEGER is
  78.      -- Upper index bound for dimension 3.
  79.       deferred
  80.       end;
  81.    
  82.    frozen line_maximum: INTEGER is
  83.      -- Equivalent of `upper1'.
  84.       do
  85.      Result := upper1;
  86.       end;
  87.  
  88.    frozen column_maximum: INTEGER is
  89.      -- Equivalent of `upper2'.
  90.       do
  91.      Result := upper2;
  92.       end;
  93.    
  94.    frozen depth_maximum: INTEGER is
  95.          -- Equivalent of `upper3'.
  96.       do
  97.          Result := upper3;
  98.       end;
  99.    
  100. feature -- Reading :
  101.    
  102.    item(line, column, depth: INTEGER): E is
  103.       require
  104.          valid_index(line,column,depth);
  105.       deferred
  106.       end;
  107.    
  108. feature -- Writing :
  109.    
  110.    put(element: like item; line, column, depth: INTEGER) is
  111.       require
  112.          valid_index(line,column,depth)
  113.       deferred
  114.       ensure
  115.          item(line,column,depth) = element
  116.       end;
  117.  
  118.    force(element: like item; line, column, depth: INTEGER) is
  119.          -- Put `element' at position (`line',`column',`depth').
  120.          -- Collection is resized first when (`line',`column',`depth')
  121.          -- is not inside current bounds. 
  122.          -- New bounds are initialized with default values.
  123.       require
  124.      line >= 0;
  125.          column >= 0;
  126.          depth >= 0
  127.       deferred
  128.       ensure
  129.          item(line,column,depth) = element;
  130.      count >= old count
  131.       end;
  132.  
  133. feature -- Index validity :
  134.    
  135.    frozen valid_line, valid_index1(line: INTEGER): BOOLEAN is
  136.       do
  137.      Result := lower1 <= line and then line <= upper1;
  138.       ensure
  139.      Result = (lower1 <= line and line <= upper1)
  140.       end;
  141.     
  142.    frozen valid_column, valid_index2(column: INTEGER): BOOLEAN is
  143.       do
  144.      Result := lower2 <= column and then column <= upper2;
  145.       ensure
  146.      Result = (lower2 <= column and column <= upper2)
  147.       end;
  148.  
  149.    frozen valid_depth, valid_index3(depth: INTEGER): BOOLEAN is
  150.       do
  151.          Result := lower3 <= depth and then depth <= upper3;
  152.       ensure
  153.          Result = (lower3 <= depth and depth <= upper3)
  154.       end;
  155.    
  156.    frozen valid_index(line, column, depth: INTEGER): BOOLEAN is
  157.       do
  158.      Result := ((lower1 <= line) and then (line <= upper1) 
  159.             and then
  160.                     (lower2 <= column) and then (column <= upper2)
  161.             and then
  162.                     (lower3 <= depth) and then (depth <= upper3)); 
  163.       ensure
  164.          Result = (valid_line(line) and valid_column(column)
  165.                         and valid_depth(depth))
  166.       end;
  167.  
  168. feature -- Counting :
  169.  
  170.    count1: INTEGER is
  171.      -- Size of the first dimension.
  172.       deferred
  173.       ensure
  174.      Result = upper1 - lower1 + 1;
  175.       end;
  176.    
  177.    frozen line_count: INTEGER is
  178.      -- Equivalent of `count1'.
  179.       do
  180.      Result := count1;
  181.       end;
  182.    
  183.    count2: INTEGER is
  184.      -- Size of the second dimension.
  185.       deferred
  186.       ensure
  187.      Result = upper2 - lower2 + 1;
  188.       end;
  189.    
  190.    frozen column_count: INTEGER is
  191.       do
  192.      Result := count2;
  193.       end;
  194.    
  195.    count3: INTEGER is
  196.          -- Size of the third dimension.
  197.       deferred
  198.       ensure
  199.          Result = upper3 - lower3 + 1;
  200.       end;
  201.    
  202.    frozen depth_count: INTEGER is
  203.       do
  204.          Result := count3;
  205.       end;
  206.    
  207.    count: INTEGER is
  208.      -- Total number of elements.
  209.       deferred
  210.       ensure
  211.          Result = line_count * column_count * depth_count
  212.       end;
  213.  
  214. feature 
  215.    
  216.    swap(line1, column1, depth1, line2, column2, depth2: INTEGER) is
  217.          -- Swap the element at index (`line1',`column1',`depth1')
  218.          -- with the element at index (`line2',`column2',`depth2').
  219.       require
  220.          valid_index(line1,column1,depth1);
  221.          valid_index(line2,column2,depth2)
  222.       deferred
  223.       ensure
  224.          item(line1,column1,depth1) = old item(line2,column2,depth2);
  225.          item(line2,column2,depth2) = old item(line1,column1,depth1);
  226.      count = old count
  227.       end;
  228.    
  229.    set_all_with(v: like item) is
  230.      -- Set all item with value `v'.
  231.       deferred
  232.       ensure
  233.      count = old count
  234.       end;
  235.    
  236.    frozen clear_all is
  237.      -- Set all items to default values.
  238.       local
  239.      value: like item;
  240.       do
  241.      set_all_with(value);
  242.       ensure
  243.      count = old count;
  244.       end;
  245.  
  246. feature -- Creating or initializing :
  247.  
  248.    from_collection3(model: COLLECTION3[like item]) is
  249.      --  Uses `model' to initialize Current.
  250.       require
  251.      model /= Void
  252.       deferred
  253.       ensure
  254.      count1 = model.count1;
  255.          count2 = model.count2;
  256.          count3 = model.count3
  257.       end;
  258.  
  259.    from_model(model: COLLECTION[COLLECTION[COLLECTION[E]]]) is
  260.      -- The `model' is used to fill line by line Current.
  261.          -- Assume all sub-collections have the same
  262.          -- dimension.
  263.       require
  264.      model /= Void
  265.       deferred
  266.       ensure
  267.      count1 = model.count;
  268.          count2 > 0 implies count2 = model.first.count;
  269.          count3 > 0 implies count3 = model.first.first.count
  270.       end;
  271.  
  272. feature -- Looking and comparison :
  273.    
  274.    all_default: BOOLEAN is
  275.          -- Do all items have their type's default value?
  276.       deferred
  277.       end;
  278.  
  279.    frozen all_cleared: BOOLEAN is
  280.       obsolete "The new name of this feature is `all_default'."
  281.       do
  282.      Result := all_default;
  283.       end;
  284.  
  285.    same_as(other: COLLECTION3[E]): BOOLEAN is
  286.      -- Unlike `is_equal', this feature can be used to compare
  287.          -- distinct implementation of COLLECTION3.
  288.       require
  289.      other /= Void
  290.       deferred
  291.       ensure
  292.      Result implies standard_same_as(other)
  293.       end;
  294.  
  295. feature -- Printing :
  296.    
  297.    frozen fill_tagged_out_memory is
  298.       local
  299.          line, column, depth: INTEGER;
  300.      v: like item;
  301.       do
  302.      tagged_out_memory.append("lower1: "); 
  303.      lower1.append_in(tagged_out_memory);
  304.      tagged_out_memory.append(" upper1: "); 
  305.      upper1.append_in(tagged_out_memory);
  306.      tagged_out_memory.append(" lower2: "); 
  307.      lower2.append_in(tagged_out_memory);
  308.      tagged_out_memory.append(" upper2: "); 
  309.          upper2.append_in(tagged_out_memory);
  310.          tagged_out_memory.append(" lower3: "); 
  311.          lower3.append_in(tagged_out_memory);
  312.          tagged_out_memory.append(" upper3: ");
  313.          upper3.append_in(tagged_out_memory);
  314.      tagged_out_memory.append(" [%N");
  315.      from
  316.         line := lower1;
  317.      until
  318.         line > upper1
  319.            or else
  320.         tagged_out_memory.count > 4096
  321.      loop
  322.         tagged_out_memory.append("line ");
  323.         line.append_in(tagged_out_memory);
  324.         tagged_out_memory.append("%T: ");
  325.         from
  326.            column := lower2;
  327.         until
  328.            column > upper2
  329.         loop
  330.                tagged_out_memory.append("column ");
  331.                column.append_in(tagged_out_memory);
  332.                tagged_out_memory.append("%T: ");
  333.                from
  334.                   depth := lower3;
  335.                until
  336.                   depth > upper3
  337.                loop
  338.                   tagged_out_memory.append("depth ");
  339.                   depth.append_in(tagged_out_memory);
  340.                   tagged_out_memory.append("%T: ");
  341.                   v := item(line,column,depth);
  342.                   if v = Void then
  343.                      tagged_out_memory.append("Void");
  344.                   else
  345.                      v.out_in_tagged_out_memory;
  346.                   end;
  347.                   tagged_out_memory.extend(' ');
  348.                   depth := depth + 1;
  349.                end;
  350.                tagged_out_memory.extend('%N');
  351.               column := column + 1;
  352.         end;
  353.         tagged_out_memory.extend('%N');
  354.         line := line + 1;
  355.      end;
  356.      if valid_line(line) then
  357.         tagged_out_memory.append("......%N"); 
  358.      end;
  359.       end;
  360.  
  361. feature -- Miscellaneous features :
  362.  
  363.    nb_occurrences(elt: E): INTEGER is
  364.      -- Number of occurrences using `equal'.
  365.          -- See also `fast_nb_occurrences' to choose
  366.      -- the apropriate one.
  367.       deferred
  368.       ensure
  369.      Result >= 0
  370.       end;
  371.    
  372.    fast_nb_occurrences(elt: E): INTEGER is
  373.      -- Number of occurrences using `='.
  374.       deferred
  375.       ensure
  376.      Result >= 0
  377.       end;
  378.  
  379.    has(x: like item): BOOLEAN is
  380.      -- Search if a element x is in the array using `equal'.
  381.          -- See also `fast_has' to choose the apropriate one.
  382.       deferred
  383.       end;
  384.    
  385.    fast_has(x: like item): BOOLEAN is
  386.      --  Search if a element x is in the array using `='.
  387.       deferred
  388.       end;
  389.    
  390.    replace_all(old_value, new_value: like item) is
  391.            -- Replace all occurences of the element `old_value' by `new_value' 
  392.      -- using `equal' for comparison.
  393.      -- See also `fast_replace_all' to choose the apropriate one.
  394.       deferred
  395.       ensure
  396.      count = old count;
  397.      nb_occurrences(old_value) = 0
  398.       end;
  399.    
  400.    fast_replace_all(old_value, new_value: like item) is
  401.            -- Replace all occurences of the element `old_value' by `new_value' 
  402.      -- using operator `=' for comparison.
  403.      -- See also `replace_all' to choose the apropriate one.
  404.       deferred
  405.       ensure
  406.      count = old count;
  407.      fast_nb_occurrences(old_value) = 0
  408.       end;
  409.  
  410.    sub_collection3(line_min, line_max, column_min, column_max,
  411.                 depth_min, depth_max: INTEGER): like Current is
  412.      -- Create a new object using selected area of `Current'.
  413.       require
  414.          valid_index(line_min,column_min,depth_min);
  415.          valid_index(line_max,column_max,depth_max)
  416.       deferred
  417.       ensure
  418.      Result /= Void
  419.       end;
  420.  
  421.    set_area(element: like item; line_min, line_max, column_min, column_max,
  422.                 depth_min, depth_max: INTEGER) is
  423.      -- Set all the elements of the selected area rectangle with `element'.
  424.       require
  425.          valid_index(line_min,column_min,depth_min);
  426.          valid_index(line_max,column_max,depth_max)
  427.       local
  428.          line, column, depth : INTEGER;
  429.       do
  430.      from
  431.         line := line_min;
  432.      until
  433.         line > line_max
  434.      loop
  435.         from
  436.            column := column_min
  437.         until
  438.            column > column_max
  439.         loop
  440.                from
  441.                   depth := depth_min
  442.                until
  443.                   depth > depth_max
  444.                loop
  445.                   put(element,line,column,depth);
  446.                   depth := depth + 1;
  447.                end;
  448.                column := column + 1;
  449.         end;
  450.         line := line + 1;
  451.      end;
  452.       ensure
  453.      count = old count;
  454.       end;
  455.  
  456. feature {COLLECTION3} -- For `same_as' implementation :
  457.  
  458.    frozen standard_same_as(other: COLLECTION3[E]): BOOLEAN is
  459.       require
  460.      generating_type /= other.generating_type
  461.       local
  462.          line, column, depth: INTEGER;
  463.       do
  464.          if lower1 /= other.lower1 then
  465.          elseif upper1 /= other.upper1 then
  466.      elseif lower2 /= other.lower2 then
  467.      elseif upper2 /= other.upper2 then
  468.          elseif lower3 /= other.lower3 then
  469.          elseif upper3 /= other.upper3 then
  470.      else
  471.         from
  472.            Result := true;
  473.            line := upper1;
  474.         until
  475.            not Result or else line < lower1
  476.         loop
  477.            from
  478.           column := upper2;
  479.            until
  480.           not Result or else column < lower2
  481.            loop
  482.                   from
  483.                      depth := upper3;
  484.                   until
  485.                      not Result or else depth < lower3
  486.                   loop
  487.                      Result := equal_like(item(line,column,depth),
  488.                                           other.item(line,column,depth));
  489.                      depth := depth - 1;
  490.                   end;
  491.                   column := column - 1;
  492.            end;
  493.            line := line - 1;
  494.         end;
  495.      end;
  496.       end;
  497.  
  498.    same_as_array3(other: ARRAY3[E]): BOOLEAN is
  499.       require
  500.      other /= Void
  501.       deferred
  502.       end;
  503.    
  504.    same_as_fixed_array3(other: FIXED_ARRAY3[E]): BOOLEAN is
  505.       require
  506.      other /= Void
  507.       deferred
  508.       end;
  509.    
  510. feature {NONE}
  511.    
  512.    frozen equal_like(e1, e2: like item): BOOLEAN is
  513.      -- Note: this feature is called to avoid calling `equal'
  514.      -- on expanded types (no automatic conversion to 
  515.      -- corresponding reference type).
  516.       do
  517.      if e1.is_basic_expanded_type then
  518.         Result := e1 = e2;
  519.      elseif e1.is_expanded_type then
  520.         Result := e1.is_equal(e2);
  521.      elseif e1 = e2 then
  522.         Result := true;
  523.      elseif e1 = Void or else e2 = Void then
  524.      else
  525.         Result := e1.is_equal(e2);
  526.      end;
  527.       end;
  528.  
  529. end -- COLLECTION3[E]
  530.